<?php

require_once APPPATH . 'libraries/TorrentEntry.php';
require_once APPPATH . 'libraries/VideoEntry.php';

/**
 * Родительский класс парсера торрентов
 *
 * @author Gennadiy Kozlenko
 */
abstract class TorrentParser_Abstract {
   
   /**
    * Максимальный размер контента
    *
    */
   const CONTENT_MAX_SIZE = 5242880;
   
   /**
    * CodeIgniter Instance
    *
    * @var object
    */
   protected $obj = null;
   
   /**
    * Страница
    *
    * @var int
    */
   protected $page = 1;
   
   /**
    * User Agent
    *
    * @var string
    */
   private $agent = null;
   
   /**
    * Таймаут в секундах
    *
    */
   private $timeout = 15;
   
   /**
    * Ссылка на файл с куками
    *
    * @var string
    */
   private $cookie = '';
   
   /**
    * Массив дополнительных кук
    *
    * @var array
    */
   private $cookies = array();
   
   /**
    * Конструктор класса
    *
    */
   public function __construct() {
      $this->obj =& get_instance();
      $this->obj->load->config('parser');
      $this->obj->load->helper('http');
      $this->timeout = $this->obj->config->item('parser_timeout');
      // Создаем файл с куками
      $this->cookie = tempnam(BASEPATH . 'cache', 'parser');
   }
   
   /**
    * Деструктор класса
    *
    */
   public function __destruct() {
      // Удаляемм временный файл
      if (file_exists($this->cookie)) {
         unlink($this->cookie);
      }
   }
   
   /**
    * Добавление дополнительной куки
    *
    * @param string $name
    * @param string $value
    */
   public function addCookie($name, $value) {
      $this->cookies[$name] = $value;
   }
   
   /**
    * Парсинг видео и получение массива объектов TorrentEntry
    *
    * @return array
    */
   public function parseItems() {
      return array();
   }
   
   /**
    * Парсинг страницы с информацией по видео
    *
    * @param TorrentEntry $entry
    * @return TorrentEntry|bool
    */
   public function parseItem(TorrentEntry $entry) {
      return $entry;
   }
   
   /**
    * Установка страницы
    *
    * @param int $page
    */
   public function setPage($page) {
      $this->page = $page;
   }
   
   /**
    * Получение страницы
    *
    * @return int
    */
   public function getPage() {
      return $this->page;
   }
   
   /**
    * Получение контента страницы
    *
    * @param string $url
    * @param string $referer
    * @param string $encoding
    * @return string
    */
   protected function getContent($url, $referer = '', $encoding = '') {
      $headers = array(
         'User-Agent: ' . $this->getAgent(),
         'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*' . '/' . '*;q=0.8',
         'Accept-Language: ru,en-us;q=0.7,en;q=0.3',
         'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'
      );
      if (!empty($referer)) {
         array_push($headers, 'Referer: ' . $referer);
      }
      $content = get_content($url, $headers, $this->timeout, $this->cookie, $this->cookies);
      if (strlen($content) > self::CONTENT_MAX_SIZE) {
         $content = substr($content, 0, self::CONTENT_MAX_SIZE);
      }
      if (!empty($encoding)) {
         $content = iconv($encoding, 'UTF-8//IGNORE', $content);
      }
      return $content;
   }
   
   /**
    * Получение контента страницы методом POST
    *
    * @param string $url
    * @param string $referer
    * @param string $encoding
    * @return string
    */
   protected function postContent($url, $post, $referer = '', $encoding = '') {
      $headers = array(
         'User-Agent: ' . $this->getAgent(),
         'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*' . '/' . '*;q=0.8',
         'Accept-Language: ru,en-us;q=0.7,en;q=0.3',
         'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'
      );
      if (!empty($referer)) {
         array_push($headers, 'Referer: ' . $referer);
      }
      $content = post_content($url, $post, $headers, $this->timeout, $this->cookie, $this->cookies);
      if (strlen($content) > self::CONTENT_MAX_SIZE) {
         $content = substr($content, 0, self::CONTENT_MAX_SIZE);
      }
      if (!empty($encoding)) {
         $content = iconv($encoding, 'UTF-8//IGNORE', $content);
      }
      return $content;
   }
   
   /**
    * Получение очередного user agent (за раз)
    *
    * @return string
    */
   private function getAgent() {
      if (null == $this->agent) {
         $agents = $this->obj->config->item('user_agents');
         if (0 < count($agents)) {
            $this->agent = $agents[rand(0, count($agents) - 1)];
         }
      }
      return $this->agent;
   }
   
}
